<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/**
 * @file navigation.test.php
 * @brief файл содержит код для тестирования класса Navigation \n
 * @include navigation.test.php
 */

/*! @addtogroup TestWebFormsQA Tестирование проекта WebFormsQA
 *  Группа включает классы для тестирования исходного кода
 *  @{
 */


/**
 * @class NavigationTest
 * @brief Класс для проверки методов класса навигации по элементам страницы Navigation \n
 *        Исходный код [ @ref database.test.php ] 
 */
class NavigationTest extends PHPUnit_TestCase {

    /**
     * Метод проверяет получение навигатора
     */
    function testGetNavigator()
    {
        $base   = &$GLOBALS["base"];
        $nav    = new Navigation(&$base);
        
        // необходимо отобразить навигатор [1-4]  [4-8][8-10][след][показать все]
        $g_count        = 10;
        $offset         = 0;
        $count_per_page = 4;
        $categoryID     = 100;
        $request        = "index.php?categoryID=$categoryID&";
        
        $flag = $nav->getNavigator($g_count, $offset, $count_per_page, $request, $out);
        $this->assertTrue($flag);
        
        $str = "
            [1-4] &nbsp;
            <a href=\"index.php?categoryID=100&offset=4\">[5-8]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=8\">[9-10]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=4\">[след]</a>
            <a href=\"index.php?categoryID=100&offset=-1\">[показать все]</a>
        ";

		$search = array("\r\n", "\n", " ");        
        // для более удобного понимания теста
        // убираем все пробелы, что бы не мешали
        $str = str_replace($search, "", $str);
        $out = str_replace($search, "", $out);

        $this->assertEquals( $str, $out );
        

        // необходимо отобразить навигатор  [пред][1-4]  [4-8]  [8-10][след][показать все]
        $g_count        = 10;
        $offset         = 4;
        $count_per_page = 4;
        $out            = "";
        $flag = $nav->getNavigator($g_count, $offset, $count_per_page, $request, $out);
        $this->assertTrue($flag);

        $str = "
            <a href=\"index.php?categoryID=100&offset=0\">[пред]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=0\">[1-4]</a> &nbsp;[5-8] &nbsp;
            <a href=\"index.php?categoryID=100&offset=8\">[9-10]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=8\">[след]</a>
            <a href=\"index.php?categoryID=100&offset=-1\">[показать все]</a>
        ";

        // для более удобного понимания теста
        // убираем все пробелы и переводы строк что бы не мешали 
        $str = str_replace($search, "", $str);
        $out = str_replace($search, "", $out);

        $this->assertEquals( $str, $out );
        
        // неправильно задаем текущее смещение
        $offset = 3;
        $flag = $nav->getNavigator($g_count, $offset, $count_per_page, $request, $out);
        $this->assertFalse($flag);

        $offset = 13;
        $flag = $nav->getNavigator($g_count, $offset, $count_per_page, $request, $out);
        $this->assertFalse($flag);

        // признак показать все -1 до этого была строка $offset = "show_all"
        // что достоточно не удобно с точки зрения безопастности т.е. трактовать
        // параметр и как целое и как строку
        $offset         = -1;
        $out            = "";
        $this->assertTrue($nav->getNavigator($g_count, $offset, $count_per_page, $request, $out));

        $str = "
            <a href=\"index.php?categoryID=100&offset=0\">[1-4]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=4\">[5-8]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=8\">[9-10]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=4\">[след]</a> [показать все]
        ";

        // убираем все пробелы и переводы строк что бы не мешали 
        $str = str_replace($search, "", $str);
        $out = str_replace($search, "", $out);

        $this->assertEquals($str, $out);
        
        
		// исправление ошибки, которая проявилось на навигаторе
		// [1-4]  [5-8]  [9-12]  [13-16]  [17-20]   ...  [29-28] [след] [показать все]
		// задача #42        
        
        // необходимо отобразить навигатор [1-4][5-8][9-12][13-16][17-20]...[29-28] [след] [показать все]
        $g_count        = 28;
        $offset         = 0;
        $count_per_page = 4;
        $categoryID     = 100;
        $out            = "";
        $request        = "index.php?categoryID=$categoryID&";
        
        $flag = $nav->getNavigator($g_count, $offset, $count_per_page, $request, $out);
        $this->assertTrue($flag);
        
        $str = "
            [1-4] &nbsp;
            <a href=\"index.php?categoryID=100&offset=4\">[5-8]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=8\">[9-12]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=12\">[13-16]</a> &nbsp;
            <a href=\"index.php?categoryID=100&offset=16\">[17-20]</a> &nbsp;
            ... &nbsp;
            <a href=\"index.php?categoryID=100&offset=24\">[25-28]</a>             
            <a href=\"index.php?categoryID=100&offset=4\">[след]</a>
            <a href=\"index.php?categoryID=100&offset=-1\">[показать все]</a>
        ";

		$search = array("\r\n", "\n", " ");        
        // для более удобного понимания теста
        // убираем все пробелы, что бы не мешали
        $str = str_replace($search, "", $str);
        $out = str_replace($search, "", $out);

        $this->assertEquals( $str, $out );
        

    } // testGetNavigator

    /**
     * Метод проверяет получение дерева категорий
     */
    function testGetTreeCategories()
    {
        $base   = &$GLOBALS["base"];
        $nav    = new Navigation($base);
        $out    = array();

        // в базе следующие категории
        //  категория1";
        //      категория1_1";
        //      категория1_2";
        //          категория1_2_1";
        //  категория2";
        //  категория3";


        // запрашиваем только корневые категории
        $this->assertTrue($nav->getTreeCategories(0, CATEGORIES_TABLE, $out));

        $etalon = array(
            array('1', 'категория1', '0'),
            array('5', 'категория2', '0'),
            array('6', 'категория3', '0')
        );
        
        Utils::compareKeysAndMean($etalon[0], $out, 0);
        Utils::compareKeysAndMean($etalon[1], $out, 1);
        Utils::compareKeysAndMean($etalon[2], $out, 2);

        $out = array();
        // раскрываем первую категорию
        $this->assertTrue($nav->getTreeCategories(1, CATEGORIES_TABLE, $out));

        $etalon = array(
            array('1', 'категория1', '0'),
            array('2', 'категория1_1', '1'),
            array('3', 'категория1_2', '1'),
            array('5', 'категория2', '0'),
            array('6', 'категория3', '0')
        );

        Utils::compareKeysAndMean($etalon[0], $out, 0);
        Utils::compareKeysAndMean($etalon[1], $out, 1);
        Utils::compareKeysAndMean($etalon[2], $out, 2);
        Utils::compareKeysAndMean($etalon[3], $out, 3);
        Utils::compareKeysAndMean($etalon[4], $out, 4);

        $out = array();
        // раскрываем категорию 1_2
        $this->assertTrue($nav->getTreeCategories(3, CATEGORIES_TABLE, $out));

        $etalon = array(
            array('1', 'категория1', '0'),
            array('2', 'категория1_1', '1'),
            array('3', 'категория1_2', '1'),
            array('4', 'категория1_2_1', '2'), // 2 - уровень вложенности
            array('5', 'категория2', '0'),
            array('6', 'категория3', '0')
        );

        Utils::compareKeysAndMean($etalon[0], $out, 0);
        Utils::compareKeysAndMean($etalon[1], $out, 1);
        Utils::compareKeysAndMean($etalon[2], $out, 2);
        Utils::compareKeysAndMean($etalon[3], $out, 3);
        Utils::compareKeysAndMean($etalon[4], $out, 4);
        Utils::compareKeysAndMean($etalon[5], $out, 5);

    } // testGetTreeCategories

    /**
     * Метод проверяет выборку диапазона значений
     */
    function testSelectRange()
    {
        $nav    = new Navigation($base);

        $in     = array(1, 2, 3, 4, 5, 6, 7);
        $size   = sizeof($in);
        $out    = array();

        // результат будет сформирован в out
        $out2 = &$nav->selectRange(0, 3, $in, $size, $out);

        $this->assertEquals(1, $out[0]);
        $this->assertEquals(2, $out[1]);
        $this->assertEquals(3, $out[2]);

        $this->assertEquals(1, $out2[0]);
        $this->assertEquals(2, $out2[1]);
        $this->assertEquals(3, $out2[2]);

        $this->assertEquals(3, sizeof($out));
        $this->assertEquals(3, sizeof($out2));

        $out    = array();
        $out2 = &$nav->selectRange(-1, 3, $in, $size, $out);

        $this->assertEquals(1, $out2[0]);
        $this->assertEquals(2, $out2[1]);
        $this->assertEquals(3, $out2[2]);
        $this->assertEquals(4, $out2[3]);
        $this->assertEquals(5, $out2[4]);
        $this->assertEquals(6, $out2[5]);
        $this->assertEquals(7, $out2[6]);

        $out2[0] = 15;
        // просто перенаправление
        $this->assertEquals(15, $in[0]);

        $out    = array();
        $out2 = &$nav->selectRange(5, 6, $in, $size, $out);

        $this->assertEquals(6, $out2[0]);
        $this->assertEquals(1, sizeof($out2));

        // диапазон задан неправильно
        $out    = array();
        $out2 = &$nav->selectRange(6, 5, $in, $size, $out);
        $this->assertFalse($out2);

        $out2 = &$nav->selectRange(8, 9, $in, $size, $out);
        $this->assertFalse($out2);


        $out2 = &$nav->selectRange(6, 8, $in, $size, $out);
        $this->assertEquals(7, $out2[0]);

    } // testSelectRange

} // LoadDataTest

/*! @} */

?>
